#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>

int main()
{
    pid_t pid = fork();
    if(pid<0)//创建子进程失败
    {
        perror("fork failed");
        exit(EXIT_FAILURE);
        //exit 函数是标准库函数，定义在 <stdlib.h> 头文件中。
        //EXIT_SUCCESS 和 EXIT_FAILURE 是在 <stdlib.h> 头文件中定义的两个宏。
        //它们用来表示标准的成功和失败退出码：
        //EXIT_SUCCESS 通常被定义为 0，用于表示程序成功地执行了所需操作。
        //EXIT_FAILURE 通常被定义为 1（尽管在某些系统中可能有不同的值），
        //用于表示程序由于某种错误而没有成功执行所需操作。
    }
    else if(pid == 0)
    {
        // 子进程
        printf("This is a child process with pid is:%d\n",getpid());
        exit(42);//子进程退出，42做为退出码。
    }
    else 
    {
        // 父进程
        int status;
        pid_t wpid;
        // 使用WNOHANG，这样即使子进程未结束，waitpid也会立即返回
        do
        {
            wpid = waitpid(pid,&status,WNOHANG);
            if(wpid==0)
            {
                printf("No child process exit,please wait\n");
                sleep(1);
            }
        } while (wpid==0);
         if (wpid == -1) 
         {
            perror("wait failed");
            exit(EXIT_FAILURE);
         }
         if(WEXITSTATUS(status))
         {
            printf("Child process exited with status:%d\n",WEXITSTATUS(status));
         }
    }
    return 0;
}
